Sistema de Nombrado en Java (JNDI) [Parte I]

Aqu� est�n los problemas que nos podr�amos encontrar cuando intentamos ejecutar un programa compilado satisfactoriamente y que usa clases JNDI.

.�Class Not Found

Problema: Obtenemos un error NoClassDefFoundError cuando ejecutamos nuestro programa.

Causa: No hemos incluido las clases JNDI (jndi.jar) en nuestro classpath, o no instalamos apropiadamente las clases JNDI.

Soluci�n: El Java 2 SDK, v1.3 ya incluye las clases JNDI por eso si estamos usando esta versi�n no deber�amos obtener este error.

Si no estamos usando Java 2 SDK, v1.3, entonces la forma de incluir las clases JNDI en nuestro entorno de ejecuci�n depende de nuestro entorno. Si estamos usando el Java 2 SDK, v1.2, debemos asegurarnos de que jndi.jar est� en el directorio JAVA_HOME/jre/lib/ext, donde JAVA_HOME es el directorio que contiene el Java Runtime Environment (JRE). Observa que en algunas plataformas, existen directorios separados para el JRE y el SDK. Debemos asegurarnos de que los ficheros Jars del JNDI est�n instalados en ambos directorios jre/lib/ext. Si est�mos usando el int�rprete java del JDK 1.1, debemos a�adir los ficheros JARs a nuestra variable de entorno CLASSPATH o a la opci�n -classpath de nuestra l�nea de comandos java.

Para un applet, necesitamos hacer que las clases del JNDI y del proveedor de servicios est�n disponibles para el applet (por ejemplo, a�adi�ndolas a la opci�n archive).

.�No Hay Contexto Inicial

Problema: Obtenemos un NoInitialContextException.

Causa: No especificamos qu� implementaci�n usar para el contexto inicial. Especificamente, la propiedad de entorno Context.INITIAL_CONTEXT_FACTORY no se configur� con el nombre de la clase de la factor�a que crear� el contexto inicial. O, no hicimos disponibles para el programa las clases del proveedor de servicios nombradas por Context.INITIAL_CONTEXT_FACTORY.

Soluci�n: Seleccionamos la propiedad de etorno Context.INITIAL_CONTEXT_FACTORY apropiadamente con el nombre de la clase de la implementaci�n del contexto incial que estamos usando. Puedes ver la secci�n Lo b�sico para m�s detalles.

Si la propiedad fue configurada, entonces debemos asegurarnos de que el nombre de la clase se tecleo correctamente, y que la clase nombrada est� disponible para nuestro programa (o en su classpath o instalada en el directorio jre/lib/ext del JRE). El Java 2 SDK, v1.3 incluye proveedores de servicio para LDAP, COS naming, y el registro RMI. Todos lo otros proveedores de servicios deben instalarse y a�adirse al entorno de ejecuci�n.

.�Conexi�n Rechazada

Problema: Obtenemos una CommunicationException, indicando "connection refused."

Causa: El servidor y el puerto indentificados por la propiedad de entorno Context.PROVIDER_URL no est�n siendo servidos por el servidor. Quiz�s alguien haya desactivado la m�quina en la que se est� ejecutando el servidor. O quiz�s, nos hemos equivocado al teclear el nombre o el puerto del servidor.

Soluci�n: Chequear que hay un servidor ejecut�ndose en ese puerto, y rearrancar el servidor si es necesario. La forma de realizar esta tarea depende del servidor LDAP que estemos usando, normalmente, hay disponible una consola o herramienta administrativa que podemos usar para administrar el servidor. Podr�amos usar esa herramienta para verificar el estado del servidor.

.�Fallo de Conexi�n

Problema: El servidor LDAP responde a otras utilidades (como su consola de administraci�n) pero parece no responder a las peticiones de nuestro programa.

Causa: El servidor no responde a peticiones de conexi�n LDAP v3. Algunos servidores (especialmente servidores p�blicos) no responden correctamente a LDAP v3, ignorando las peticiones en lugar de rechazarlas.

Tambi�n, algunos servidores LDAP v3 teinen problemas al manejar un control que el proveedor de servicios de Sun env�a autom�ticamente y frecuentemente devuelven un c�digo de fallo espec�fico del servidor.

Soluci�n: Intentemos configurar la propiedad de entorno "java.naming.ldap.version" a "2". El proveedor de servivio LDAP por defecto intenta conectarse a un servidor LDAP usando el LDAP v3; si este falla, intenta usar LDAP v2. Si el servidor silenciosamente ignora la petici�n v3, entonces el proveedor asume que la petici�n funcion�. Para trabajar con dichos servidores, debemos seleccionar expl�citamente la versi�n del protocolo para asegurarnos un comportamiento apropiado del servidor.

Si el servidor es un servidor v3, intentemos configurar la siguiente propiedad de entorno antes de crear el contexto inicial.

env.put(Context.REFERRAL, "throw");

Esto desactiva el control que proveedor LDAP env�a autom�ticamente.

.�El Programa se Cuelga

Problema: El programa se cuelga.

Causas: Algunos servidores (especialmente los p�blicos) no quieren responder (incluso ni respuestas negativas) si intentamos realizar una b�squeda que podr�a generar demasiados resultados o que requiera que el servidor examine demasiadas entradas para poder generar una respuesta. Dichos servidores est�n intentando limitar la cantidad de recursos que gastan en pre-peticiones b�sicas.

O, est�mos intentando usar Secure Socket Layer (SSL) contra un servidor/puerto que no lo soporta, y viceversa (es decir, est�mos intentando usar un socket normal para hablar con un puerto SSL).

Soluci�n: Si nuestro programa se cuelga es porque el servidor est� intentando restringir el uso de sus recursos, entonces repetimos nuestra petici�n usando una consulta que devuelva un s�lo resultado o unos pocos resultados. Esto nos ayudar� a determinar si el servidor est� vivo. Si es as�, podemos abordar nuestra consulta inicial y reenviarsela.

Si nuestro programa se cuelga por problemas SSL, necesitamos encontrar si el puerto es un puerto SSL y luego configurar la propiedad de entorno Context.SECURITY_PROTOCOL de la forma apropiada. Si el puerto es un un puerto SSL, esta propiedad deber�a ser "ssl". Si no es un puerto SSL, est� propiedad no deber�a estar configurada.

.�Nombre No Encontrado

Problema: Obtenemos una NameNotFoundException.

Causas: Cuando inicializamos el contexto inicial para el LDAP, suministramos un nombre ra�z-distinguido. Por ejemplo, si configuramos la propiedad de entorno Context.PROVIDER_URL para el contexto incial a "ldap://ldapserver:389/o=JNDITutorial" y subsecuentemente suministramos un nombre como "cn=Joe,c=us", entonces el nombre completo que pasamos al servicio LDAP fue "cn=Joe,c=us,o=JNDITutorial".

Si este era realmente el nombre que quer�amos, deber�amos chequear nuestro servidor para asegurarnos de que existe dicha entrada.

Tambi�n, el Netscape Directory Server devuelve este error si suministramos un nombre distinguido incorrecto para prop�sitos de autentificaci�n. Por ejemplo, el proveedor LDAP lanza una NameNotFoundException si configuramos la propiedad de entorno Context.SECURITY_PRINCIPAL como "cn=Admin, o=Tutorial", y "cn=Admin, o=Tutorial" no es una entrada del servidor LDAP. El error correcto devuelto por el Netscape Directory Server realmente deber�a ser algo relacionado con la autentificaci�n en vez de "name not found."

Soluci�n: Verificar que el nombre que suministramos es una entrada existente en el servidor. Podemos hacer esto listando los contextos padres de la entrada o usando alguna otra herramienta como la consola de administraci�n del servidor de directorio.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO